Escopos dentro do JavaScript:
1: Escopo Global : O que for declarado neste escopo estará acessível a qualquer item do código.
Ex:
<script>
var global;
</script>
2: Escopo de Função : A variável é definida dentro de uma função.
Caso ela seja declarada com VAR terá seu escopo promovido a global.
Se for declarada com LET terá seu escopo de função preservado ( não estará visível pelo global).
O que for declarado neste escopo estará acessível a qualquer item do código.
Ex:
<script>
function x(){
var global;
let varfunction;
}
}
</script>
3-Escopo de bloco: Ocorre quando a variável é definida dentro de um bloco( entre {} ),
Temos aqui 2 possibilidades :
3.1-Quando a declaração da variável é feito dentro de um bloco que esta dentro de uma função.
Neste caso,se a variável for declarada como VAR, terá seu escopo promovido para escopo de função.
Mas se a variável for declarada como LET, terá seu escopo mantido no escopo apenas do bloco.
<script>
function x(){
if(true){
var funcao;
let varbloco;
}
}
}
</script>
3.2-Quando a declaração da variável é feito dentro de um bloco que esta dentro do escopo global.
Neste caso,se a variável for declarada como VAR, terá seu escopo promovido para escopo global.
Mas se a variável for declarada como LET, terá seu escopo mantido no escopo apenas do bloco.
<script>
if(true){
var funcao;
let varbloco;
}
}
</script>
Hoisting:
Sempre que declaramos uma variavel com o comando VAR este comportamento ocorrerá quando uma variável, definida dentro de escopo, é , por um detalhe do JavaScript,
promovida em seu escopo elevado para um nível imediatamente superior.
Diferença entre o let e o var:
O let foi inventado para evitar o hoisting feito pelo javascript em certas ocasiões como
ao declararmos uma variável com var dentro de uma função.
Portanto o comando LET não possibilita o hoisting de variáveis.